/*	Copyright (C) 2012  Claude Richard
 *
 *	Optimist Racing is free software: you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation, either version 3 of the License, or
 *	(at your option) any later version.
 *
 *	Optimist Racing is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with Optimist Racing.  If not, see <http://www.gnu.org/licenses/>.
 */

//#pragma once
//
//#include <string>
//#include <iostream>
//
//
//struct Assignment;
//
//class Expression
//{
//public:
//	//Expression differentiate( const Expression& wrtExpression );
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const = 0;
//	virtual std::ostream& operator << ( std::ostream& out ) = 0;
//	std::string toString() const;
//};
//
//
//struct Assignment
//{
//	Assignment( const Expression& exp, double value );
//	~Assignment();
////  members
//	const Expression& mExpression;
//	double value;
//};
//
//
//class NumberExpression : public Expression
//{
//public:
//	NumberExpression( double value );
//	~NumberExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const ;
//	virtual std::string toString() const;
//private:
//	double mValue;
//};
//
//
//class AdditionExpression : public Expression
//{
//public:
//	AdditionExpression( const Expression& expression1, const Expression& expression2 );
//	~AdditionExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const ;
//	virtual std::string toString() const;
//private:
//	int mNumExpressions;
//	const Expression& mExpression1;
//	const Expression& mExpression2;
//};
//
//
//class SubtractionExpression : public Expression
//{
//public:
//	SubtractionExpression( int numExpressions, const Expression** expressions );
//	~SubtractionExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const ;
//	virtual std::string toString() const;
//private:
//	int mNumExpressions;
//	const Expression** mExpressions;
//};
//
//
//class MultiplicationExpression : public Expression
//{
//public:
//	MultiplicationExpression( int numExpressions, const Expression** expressions );
//	~MultiplicationExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const ;
//	virtual std::string toString() const;
//private:
//	int mNumExpressions;
//	const Expression** mExpressions;
//};
//
//
//class CosineExpression : public Expression
//{
//public:
//	CosineExpression( const Expression* expression );
//	~CosineExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const;
//	virtual std::string toString() const;
//private:
//	const Expression* mExpression;
//};
//
//
//class SineExpression : public Expression
//{
//public:
//	SineExpression( const Expression* expression );
//	~SineExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const;
//	virtual std::string toString() const;
//private:
//	const Expression* mExpression;
//};
//
//
//class VariableExpression : public Expression
//{
//public:
//	VariableExpression( std::string name );
//	~VariableExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const;
//	virtual std::string toString() const;
//private:
//	std::string mName;
//};
//
//
//class UnknownFunctionExpression : public Expression
//{
//public:
//	UnknownFunctionExpression( const std::string& name, int numArguments, const Expression** arguments );
//	~UnknownFunctionExpression();
//	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const;
//	virtual std::string toString() const;
//private:
//	std::string			mName;
//	int					mNumArguments;
//	const Expression**	mArguments;
//};
//
//
////class DerivativeExpression : public Expression
////{
////public:
////	DerivativeExpression( Expression* topExpression );
////	~DerivativeExpression();
////	virtual double Evaluate( int numSpecifications, const Expression** variables, double* values ) const ;
////	virtual std::string toString() const;
////private:
////	Expression*		mTopExpression;
////	int				mNumBottom;
////	Expression**	mBottomExpressions;
////	int*			mBottomExponents;
////};
//
//
//Expression& operator + ( const Expression& a, const Expression& b );
//Expression& operator - ( const Expression& a, const Expression& b );
//Expression& operator * ( const Expression& a, const Expression& b );